Skip to content

Conversation

@peterfriese
Copy link
Contributor

This change introduces Swift AsyncSequence support for Firebase Realtime Database, enabling a modern, structured concurrency approach for observing data.

Key changes include:

  • DatabaseQuery.snapshots: An asynchronous sequence for value events, consistent with Firestore's snapshots and Android's RTDB snapshots().
  • DatabaseQuery.childEvents(): An asynchronous sequence for child events (childAdded, childChanged, childRemoved, childMoved), consistent with Android's RTDB childEvents().
  • Implementation uses the AsyncIteratorProtocol pattern, aligning with the Firestore SDK for Sendable compliance and lazy listener initialization.
  • DatabaseQuery is marked @retroactive @unchecked Sendable to resolve concurrency warnings.
  • The handles array in DatabaseChildEventsSequence.Iterator.init is explicitly captured by value in onTermination to prevent concurrency issues.
  • Added usage tests to DatabaseAPITests.swift.
  • Refactored Sendable conformances to be grouped together for better readability.

This change introduces Swift AsyncSequence support for Firebase Realtime Database, enabling a modern, structured concurrency approach for observing data.

Key changes include:
- `DatabaseQuery.snapshots`: An asynchronous sequence for value events, consistent with Firestore's `snapshots` and Android's RTDB `snapshots()`.
- `DatabaseQuery.childEvents()`: An asynchronous sequence for child events (`childAdded`, `childChanged`, `childRemoved`, `childMoved`), consistent with Android's RTDB `childEvents()`.
- Implementation uses the `AsyncIteratorProtocol` pattern, aligning with the Firestore SDK for `Sendable` compliance and lazy listener initialization.
- `DatabaseQuery` is marked `@retroactive @unchecked Sendable` to resolve concurrency warnings.
- The `handles` array in `DatabaseChildEventsSequence.Iterator.init` is explicitly captured by value in `onTermination` to prevent concurrency issues.
- Added usage tests to `DatabaseAPITests.swift`.
- Refactored Sendable conformances to be grouped together for better readability.
@gemini-code-assist
Copy link
Contributor

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

@google-oss-bot
Copy link
Collaborator

1 Warning
⚠️ Did you forget to add a changelog entry? (Add #no-changelog to the PR description to silence this warning.)

Generated by 🚫 Danger

@ncooke3 ncooke3 added the needs-jules-review Label for manually marking PRs as ready for a review from Jules. label Jan 28, 2026
Copy link

@laike9m laike9m left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a great addition to the Realtime Database SDK, providing a modern Swift Concurrency interface for observing data changes. The implementation follows the established patterns in the Firebase Apple SDKs.

I have one minor suggestion regarding Sendable conformance for the DatabaseEvent enum.

// MARK: - DatabaseEvent

/// An enumeration of granular child-level events.
public enum DatabaseEvent {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The DatabaseEvent enum should explicitly conform to Sendable. Since it is a public enum used as the element type of an AsyncSequence, explicit conformance ensures it can be safely used across concurrency boundaries in strict mode. Note that DataSnapshot is already marked NS_SWIFT_SENDABLE in its header, so the enum will satisfy the requirements.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good suggestion.

Interesting: given the symbol, DataSnapshot, in a Swift context, it recognized that the symbol was being bridged from Objective-C and the source-of-truth definition was marked sendable.

FirebaseDatabase/Sources/Public/FirebaseDatabase/FIRDataSnapshot.h- */
FirebaseDatabase/Sources/Public/FirebaseDatabase/FIRDataSnapshot.h-NS_SWIFT_SENDABLE
FirebaseDatabase/Sources/Public/FirebaseDatabase/FIRDataSnapshot.h:NS_SWIFT_NAME(DataSnapshot)
FirebaseDatabase/Sources/Public/FirebaseDatabase/FIRDataSnapshot.h-@interface FIRDataSnapshot : NSObject
FirebaseDatabase/Sources/Public/FirebaseDatabase/FIRDataSnapshot.h-

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, from the trace the agent did read FIRDataSnapshot.h so it had the context.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api: database needs-jules-review Label for manually marking PRs as ready for a review from Jules.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants